package com.bsoft.AQS;

import java.util.concurrent.TimeUnit;

/**
 * @program: demo
 * @description: 锁支持
 * @author: hdh
 * @create: 2022:03:31 15:54
 */
   /*
      wait 方法和notify 方法 两个都要去掉同步代码块
      会发现异常  程序一直无法结束
      先wait 后notify notifyall 方法 等待中的线程才会被唤醒  否则无法唤醒
/*
    java  jvm
    juc  --  AQS  -- 前置知识   LockSupper
    学习方法
    1 是什么   用于创建锁 和其他同步类的基本线程阻塞原语
    2 能干嘛      lockSupper 是用来创建锁和其他同步类的基本线程阻塞原语
       LockSuppert 中的park 和unpark()的作用分别是阻塞线程和解除阻塞线程
    3 去哪下
    4 怎么玩
         synchronized                             lock
   wait                 notify         await                   signal       lockSupport
    //三种让线程等待和唤醒的方法
     方式1 使用Object中的wait()方法让线程等待 使用Object中的notify()方法唤醒线程


     方式2 使用juc 包中的Condition的await 方法让线程等待 使用signal()方法唤醒线程
     方式3 LockSupport类可以阻塞当前线程以及唤醒指定被阻塞的线程
 */
//等待唤醒机制
public class LockSupper {
    static Object objectlock = new Object();

    public static void main(String[] args) {
        new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (objectlock) {
                System.out.println(Thread.currentThread().getName() + "\t" + "-------------com in ");
                try {

                    objectlock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "\t" + "------被唤醒");
            }
        }, "A").start();
        new Thread(() -> {
            synchronized (objectlock) {
                objectlock.notify();
                System.out.println(Thread.currentThread().getName() + "\t" + "----唤醒动作");
            }
        }, "B").start();
    }
}
